//! UniGetUI集成示例
//! 展示如何使用Kuya项目中集成的UniGetUI服务进行多源包管理操作

use std::sync::Arc;
use std::sync::Mutex;
use kuya_safe_services::{ServiceManager, UniGetUIServiceImpl};
use log::{info, error};
use tokio::runtime::Runtime;

/// UniGetUI集成示例函数
fn main() {
    // 初始化日志系统
    env_logger::init();
    
    info!("=== Kuya UniGetUI集成示例 ===");
    
    // 创建Tokio运行时
    let rt = Runtime::new().expect("Failed to create Tokio runtime");
    
    // 创建并启动服务管理器
    let service_manager = match ServiceManager::new() {
        Ok(manager) => {
            info!("服务管理器创建成功");
            manager
        },
        Err(err) => {
            error!("服务管理器创建失败: {}", err);
            return;
        }
    };
    
    // 启动所有服务
    if let Err(err) = service_manager.start_all_services() {
        error!("启动服务失败: {}", err);
        return;
    }
    
    // 获取UniGetUI服务
    let unigetui_service = service_manager.get_unigetui_service();
    
    // 使用UniGetUI服务执行包管理操作
    rt.block_on(async {
        // 1. 获取可用的包管理器列表
        info!("\n1. 获取可用的包管理器列表...");
        match unigetui_service.lock().unwrap().get_package_managers().await {
            Ok(managers) => {
                info!("可用的包管理器 ({}个):", managers.len());
                for manager in managers {
                    info!("- {}", manager);
                }
            },
            Err(err) => {
                error!("获取包管理器列表失败: {}", err);
            }
        }
        
        // 2. 切换活动的包管理器（例如切换到winget）
        info!("\n2. 切换到winget包管理器...");
        if let Err(err) = unigetui_service.lock().unwrap().set_active_package_manager("winget").await {
            error!("切换包管理器失败: {}", err);
        } else {
            info!("已成功切换到winget包管理器");
        }
        
        // 3. 搜索包（以"vscode"为例）
        info!("\n3. 搜索包 'vscode'...");
        match unigetui_service.lock().unwrap().search_package("vscode").await {
            Ok(results) => {
                info!("搜索结果 ({}个):", results.len());
                for pkg in results {
                    info!("- {}@{} ({}, {})");
                    info!("  描述: {}", pkg.description);
                    info!("  已安装: {}", if pkg.installed { "是" } else { "否" });
                }
            },
            Err(err) => {
                error!("搜索包失败: {}", err);
            }
        }
        
        // 4. 获取已安装的包列表
        info!("\n4. 获取已安装的包列表...");
        match unigetui_service.lock().unwrap().get_installed_packages().await {
            Ok(packages) => {
                if packages.is_empty() {
                    info!("暂无已安装的包");
                } else {
                    info!("已安装的包 ({}个):", packages.len());
                    for pkg in packages {
                        info!("- {}@{} ({})");
                        info!("  描述: {}", pkg.description);
                        info!("  包管理器: {}", pkg.manager);
                    }
                }
            },
            Err(err) => {
                error!("获取已安装的包列表失败: {}", err);
            }
        }
        
        // 5. 检查特定包是否已安装
        info!("\n5. 检查包 'example-package' 是否已安装...");
        let package_name = "example-package";
        match unigetui_service.lock().unwrap().is_package_installed(package_name).await {
            Ok(is_installed) => {
                if is_installed {
                    info!("包 '{}' 已安装", package_name);
                    // 如果已安装，可以提供卸载建议
                    info!("提示: 可以使用以下代码卸载该包:");
                    info!(r#"// unigetui_service.lock().unwrap().uninstall_package("{}").await"#, package_name);
                } else {
                    info!("包 '{}' 未安装", package_name);
                    // 如果未安装，提供安装建议
                    info!("提示: 可以使用以下代码安装该包:");
                    info!(r#"// unigetui_service.lock().unwrap().install_package("{}", "winget", false).await"#, package_name);
                }
            },
            Err(err) => {
                error!("检查包 '{}' 是否已安装失败: {}", package_name, err);
            }
        }
        
        // 6. 模拟安装一个包
        info!("\n6. 模拟安装包 'demo-package'...");
        if let Err(err) = unigetui_service.lock().unwrap().install_package("demo-package", "winget", false).await {
            error!("安装包失败: {}", err);
        } else {
            info!("包 'demo-package' 安装成功");
        }
        
        // 7. 模拟卸载一个包
        info!("\n7. 模拟卸载包 'demo-package'...");
        if let Err(err) = unigetui_service.lock().unwrap().uninstall_package("demo-package").await {
            error!("卸载包失败: {}", err);
        } else {
            info!("包 'demo-package' 卸载成功");
        }
        
        // 8. 模拟更新一个包
        info!("\n8. 模拟更新包 'example-package'...");
        if let Err(err) = unigetui_service.lock().unwrap().update_package("example-package").await {
            error!("更新包失败: {}", err);
        } else {
            info!("包 'example-package' 更新成功");
        }
        
        // 9. 切换到其他包管理器（例如scoop）
        info!("\n9. 切换到scoop包管理器...");
        if let Err(err) = unigetui_service.lock().unwrap().set_active_package_manager("scoop").await {
            error!("切换包管理器失败: {}", err);
        } else {
            info!("已成功切换到scoop包管理器");
            // 在新的包管理器下搜索包
            info!("\n在scoop下搜索包 'git'...");
            if let Ok(results) = unigetui_service.lock().unwrap().search_package("git").await {
                info!("搜索结果 ({}个)", results.len());
            }
        }
    });
    
    info!("\n=== UniGetUI集成示例完成 ===");
    info!("\n提示：此示例中的包管理操作目前为模拟实现。");
    info!("在实际集成中，这些操作将通过UniGetUI的API执行实际的包管理功能。");
}